home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / haeberli / libimage / row.c < prev   
Encoding:
C/C++ Source or Header  |  1994-08-02  |  5.3 KB  |  233 lines

  1. /*
  2.  * Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. /*
  18.  *    putrow, getrow -
  19.  *
  20.  *                Paul Haeberli - 1984
  21.  *
  22.  */
  23. #include    <stdio.h>
  24. #include    "image.h"
  25.  
  26. int
  27. putrow(image,buffer,y,z) 
  28. register IMAGE    *image;
  29. unsigned short    *buffer;
  30. unsigned      y, z;
  31. {
  32.     register unsigned short     *sptr;
  33.     register unsigned char      *cptr;
  34.     register unsigned int x;
  35.     register unsigned long min, max;
  36.     register long cnt;
  37.  
  38.     if( !(image->flags & (_IORW|_IOWRT)) )
  39.     return -1;
  40.     if(image->dim<3)
  41.     z = 0;
  42.     if(image->dim<2)
  43.     y = 0;
  44.     if(ISVERBATIM(image->type)) {
  45.     switch(BPP(image->type)) {
  46.         case 1: 
  47.         min = image->min;
  48.         max = image->max;
  49.         cptr = (unsigned char *)image->tmpbuf;
  50.         sptr = buffer;
  51.         for(x=image->xsize; x--;) { 
  52.             *cptr = *sptr++;
  53.             if (*cptr > max) max = *cptr;
  54.             if (*cptr < min) min = *cptr;
  55.             cptr++;
  56.         }
  57.         image->min = min;
  58.         image->max = max;
  59.         img_seek(image,y,z);
  60.         cnt = image->xsize;
  61.         if (img_write(image,image->tmpbuf,cnt) != cnt) 
  62.             return -1;
  63.         else
  64.             return cnt;
  65.         /* NOTREACHED */
  66.  
  67.         case 2: 
  68.         min = image->min;
  69.         max = image->max;
  70.         sptr = buffer;
  71.         for(x=image->xsize; x--;) { 
  72.             if (*sptr > max) max = *sptr;
  73.             if (*sptr < min) min = *sptr;
  74.             sptr++;
  75.         }
  76.         image->min = min;
  77.         image->max = max;
  78.         img_seek(image,y,z);
  79.         cnt = image->xsize<<1;
  80.         if(image->dorev)    
  81.             cvtshorts(buffer,cnt);
  82.         if (img_write(image,buffer,cnt) != cnt) {
  83.             if(image->dorev)    
  84.             cvtshorts(buffer,cnt);
  85.             return -1;
  86.         } else {
  87.             if(image->dorev)    
  88.             cvtshorts(buffer,cnt);
  89.             return image->xsize;
  90.         }
  91.         /* NOTREACHED */
  92.  
  93.         default:
  94.         i_errhdlr("putrow: weird bpp\n");
  95.     }
  96.     } else if(ISRLE(image->type)) {
  97.     switch(BPP(image->type)) {
  98.         case 1: 
  99.         min = image->min;
  100.         max = image->max;
  101.         sptr = buffer;
  102.         for(x=image->xsize; x--;) { 
  103.             if (*sptr > max) max = *sptr;
  104.             if (*sptr < min) min = *sptr;
  105.             sptr++;
  106.         }
  107.         image->min = min;
  108.         image->max = max;
  109.         cnt = img_rle_compact(buffer,2,image->tmpbuf,1,image->xsize);
  110.         img_setrowsize(image,cnt,y,z);
  111.         img_seek(image,y,z);
  112.         if (img_write(image,image->tmpbuf,cnt) != cnt) 
  113.             return -1;
  114.         else
  115.             return image->xsize;
  116.         /* NOTREACHED */
  117.  
  118.         case 2: 
  119.         min = image->min;
  120.         max = image->max;
  121.         sptr = buffer;
  122.         for(x=image->xsize; x--;) { 
  123.             if (*sptr > max) max = *sptr;
  124.             if (*sptr < min) min = *sptr;
  125.             sptr++;
  126.         }
  127.         image->min = min;
  128.         image->max = max;
  129.         cnt = img_rle_compact(buffer,2,image->tmpbuf,2,image->xsize);
  130.         cnt <<= 1;
  131.         img_setrowsize(image,cnt,y,z);
  132.         img_seek(image,y,z);
  133.         if(image->dorev)
  134.             cvtshorts(image->tmpbuf,cnt);
  135.         if (img_write(image,image->tmpbuf,cnt) != cnt) {
  136.             if(image->dorev)
  137.             cvtshorts(image->tmpbuf,cnt);
  138.             return -1;
  139.         } else {
  140.             if(image->dorev)
  141.             cvtshorts(image->tmpbuf,cnt);
  142.             return image->xsize;
  143.         }
  144.         /* NOTREACHED */
  145.  
  146.         default:
  147.         i_errhdlr("putrow: weird bpp\n");
  148.     }
  149.     } else 
  150.     i_errhdlr("putrow: weird image type\n");
  151. }
  152.  
  153. getrow(image,buffer,y,z) 
  154. register IMAGE *image;
  155. unsigned short *buffer;
  156. register unsigned int y, z;
  157. {
  158.     register short i;
  159.     register unsigned char *cptr;
  160.     register unsigned short *sptr;
  161.     register short cnt; 
  162.  
  163.     if( !(image->flags & (_IORW|_IOREAD)) )
  164.     return -1;
  165.     if(image->dim<3)
  166.     z = 0;
  167.     if(image->dim<2)
  168.     y = 0;
  169.     img_seek(image, y, z);
  170.     if(ISVERBATIM(image->type)) {
  171.     switch(BPP(image->type)) {
  172.         case 1: 
  173.         if (img_read(image,image->tmpbuf,image->xsize) 
  174.                                 != image->xsize) 
  175.             return -1;
  176.         else {
  177.             cptr = (unsigned char *)image->tmpbuf;
  178.             sptr = buffer;
  179.             for(i=image->xsize; i--;)
  180.             *sptr++ = *cptr++;
  181.         }
  182.         return image->xsize;
  183.         /* NOTREACHED */
  184.  
  185.         case 2: 
  186.         cnt = image->xsize<<1; 
  187.         if (img_read(image,buffer,cnt) != cnt)
  188.             return -1;
  189.         else {
  190.             if(image->dorev)
  191.             cvtshorts(buffer,cnt);
  192.             return image->xsize;
  193.         }
  194.         /* NOTREACHED */
  195.  
  196.         default:
  197.         i_errhdlr("getrow: weird bpp\n");
  198.         break;
  199.     }
  200.     } else if(ISRLE(image->type)) {
  201.     switch(BPP(image->type)) {
  202.         case 1: 
  203.         if( (cnt = img_getrowsize(image)) == -1 )
  204.             return -1;
  205.         if( img_read(image,image->tmpbuf,cnt) != cnt )
  206.             return -1;
  207.         else {
  208.             img_rle_expand(image->tmpbuf,1,buffer,2);
  209.             return image->xsize;
  210.         }
  211.         /* NOTREACHED */
  212.  
  213.         case 2: 
  214.         if( (cnt = img_getrowsize(image)) == -1 )
  215.             return -1;
  216.         if( cnt != img_read(image,image->tmpbuf,cnt) )
  217.             return -1;
  218.         else {
  219.             if(image->dorev)
  220.             cvtshorts(image->tmpbuf,cnt);
  221.             img_rle_expand(image->tmpbuf,2,buffer,2);
  222.             return image->xsize;
  223.         }
  224.         /* NOTREACHED */
  225.  
  226.         default:
  227.         i_errhdlr("getrow: weird bpp\n");
  228.         break;
  229.     }
  230.     } else 
  231.     i_errhdlr("getrow: weird image type\n");
  232. }
  233.